package com.star.common.oss.factory;

import com.star.common.oss.contract.dto.FileUploadStatusDTO;
import com.star.common.oss.contract.dto.OssStsDTO;
import com.star.common.oss.contract.dto.OssTemporaryUrlDTO;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

/**
 * oss类型操作
 *
 * @author zhouhengzhe
 */
public interface OssTypeServiceFactory {

    /**
     * OSS类型
     *
     * @return 类型
     */
    String type();

    /**
     * 获取临时访问凭证
     *
     * @param sessionName   SessionName的长度和规则，不要有空格，只能有'-' '_' 字母和数字等字符
     * @param bucketName    oss桶 例如 ldstore
     * @param regionId      RAM的地域ID。以华东1（杭州）地域为例，regionID填写为cn-hangzhou。也可以保留默认值，默认值为空字符串（""）。
     * @param stsApiVersion sts版本
     * @param roleArn       获取的角色ARN
     * @param policyJson    比如以下Policy用于限制仅允许使用临时访问凭证向目标存储空间examplebucket下的src目录上传文件。
     *                      临时访问凭证最后获得的权限是步骤4设置的角色权限和该Policy设置权限的交集，即仅允许将文件上传至目标存储空间examplebucket下的src目录。
     *                      如果policy为空，则用户将获得该角色下所有权限。
     *                      {\n" +
     *                      "    \"Version\": \"1\", \n" +
     *                      "    \"Statement\": [\n" +
     *                      "        {\n" +
     *                      "            \"Action\": [\n" +
     *                      "                \"oss:PutObject\"\n" +
     *                      "            ], \n" +
     *                      "            \"Resource\": [\n" +
     *                      "                \"acs:oss:*:*:examplebucket/src/*\" \n" +
     *                      "            ], \n" +
     *                      "            \"Effect\": \"Allow\"\n" +
     *                      "        }\n" +
     *                      "    ]\n" +
     *                      "}
     * @return 临时访问凭证
     */
    OssStsDTO getSts(String sessionName, String bucketName, String regionId, String stsApiVersion, String roleArn,
                     String policyJson);

    /**
     * 获取临时url
     *
     * @param contentType  请求头
     * @param bucketName   桶名
     * @param objectKey    文件名
     * @param documentType 文件类型 例如 jpg
     * @return 临时url
     */
    OssTemporaryUrlDTO getTemporaryUrl(String contentType, String bucketName, String objectKey, String documentType);

    /**
     * 文件上传
     *
     * @param uploadFile 上传的文件
     * @param fileName   文件名称
     * @param bucketName 桶名称
     * @return 返回的路径
     */
    String uploadFile(MultipartFile uploadFile, String fileName, String bucketName);

    /**
     * 文件流上传
     *
     * @param fileName    文件名称
     * @param bucketName  桶名称
     * @param out         文件流
     * @param contentType 文件类型
     * @return 返回的路径
     */
    String uploadFileByte(String fileName, String bucketName, byte[] out, String contentType);

    /**
     * 获取文件上传进度
     *
     * @param fileName   文件名称
     * @param bucketName 桶名称
     * @return 返回文件上传进度
     */
    FileUploadStatusDTO getFileUploadPlan(String fileName, String bucketName);

    /**
     * 文件下载
     *
     * @param response   响应
     * @param fileName   文件名称
     * @param bucketName 桶名称
     */
    void fileDownload(HttpServletResponse response, String fileName, String bucketName);

    /**
     * 删除文件
     *
     * @param fileName   文件名称
     * @param bucketName 桶名称
     */
    void deleteFile(String fileName, String bucketName);

}
